import java.util.ArrayList;
import java.util.Scanner;

class Node {
    int x;
    int y;
    public Node(int x, int y) {
        this.x = x;
        this.y = y;
    }
}
public class demo {

    //    年终奖
//小东所在公司要发年终奖，而小东恰好获得了最高福利，他要在公司年会上参与一个抽奖游戏，游戏在一个6*6的棋盘上进行，上面放着36个价值不等的礼物，
//每个小的棋盘上面放置着一个礼物，他需要从左上角开始游戏，每次只能向下或者向右移动一步，到达右下角停止，一路上的格子里的礼物小东都能拿到，请设计
//一个算法使小东拿到价值最高的礼物。给定一个6*6的矩阵board，其中每个元素为对应格子的礼物价值,左上角为[0,0],请返回能获得的最大价值，
// 保证每个礼物价值大于100小于1000。
    public int getMost(int[][] board) {
        int row = board.length;
        int col = board[0].length;
        // 对第一行进行赋值 因为第一行的每一个最大值只能从arr[0][j-1]前一个值得到
        // 同理 第一列也一样
        for (int j=1; j<col; j++) {
            board[0][j] += board[0][j-1];
        }
        // 处理第一列
        for (int i=1; i<row; i++) {
            board[i][0] += board[i-1][0];
        }
        for (int i=1; i<row; i++) {
            for (int j=1; j<col; j++) {
                board[i][j] += Math.max(board[i-1][j], board[i][j-1]);
            }
        }
        // 返回值记得行列都需要 -1
        return board[row-1][col-1];
    }






    //    迷宫问题△△△
    // board 表示迷宫矩阵  行row 列col
    // x y 表示当前位置
    // mark 表示标记矩阵
    // path 保存当前每一个路径
    // minPath  保存最短路径
    public static void getMazeDistance(int[][] board, int row, int col, int x, int y, int[][] mark, ArrayList<Node> path, ArrayList<Node> minPath) {

        // 1.判断该位置是否越界  是否走过 是否有障碍
        if (x<0 || x>=row || y<0 || y>=col
                || mark[x][y]==1
                || board[x][y]==1) {
            return;
        }

        // 2.链表保存该位置 并 标记该位置已经走过
        path.add(new Node(x,y));
        mark[x][y] = 1;

        // 3.判断是否是出口(右下角)位置    递归结束条件
        if (x==row-1 && y==col-1) {
            // 判断是否是最短路径
            if (minPath.isEmpty() || path.size()<minPath.size()) {
                minPath.clear();
                for (Node n:path) {
                    minPath.add(n);
                }
            }
        }
        // 4.判断其他路径 该位置的上下左右
        getMazeDistance(board, row, col, x-1, y, mark, path, minPath);
        getMazeDistance(board, row, col, x+1, y, mark, path, minPath);
        getMazeDistance(board, row, col, x, y-1, mark, path, minPath);
        getMazeDistance(board, row, col, x, y+1, mark, path, minPath);

        // 5.当前路径都走不通 回退
        // 当前位置从路径中删除 并把标记改回0
        path.remove(path.size()-1);
        mark[x][y] = 0;
    }
    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        int n = in.nextInt();
        int m = in.nextInt();
        // 迷宫矩阵
        int[][] maze = new int[n][m];
        for (int i=0; i<n; i++) {
            for (int j=0; j<m; j++) {
                maze[i][j] = in.nextInt();
            }
        }
        // 标记是否走过的点
        int[][] mark = new int[n][m];
        // 路径
        ArrayList<Node> path = new ArrayList<>();
        ArrayList<Node> minPath = new ArrayList<>();
        getMazeDistance(maze, n, m, 0, 0, mark, path, minPath);

        // 打印
        for (Node node : minPath) {
            System.out.println("(" + node.x + "," + node.y + ")");
        }
    }
}
